#define kAliasDataRefType FOUR_CHAR_CODE('alis')
#define SHOW_ONLY_AUDIO_FILES 1
#define SHOW_ONLY_VIDEO_FILES 0
OSStatus GetFSSpecFromAEDesc( FSSpec *fsspec, AEDesc* theItem )
{
OSStatus err = noErr;
AEDesc coerceDesc = { NULL, NULL };
/* AEDesc Ç™Ç‹Çæ FSSpec Ç≈ǻǢèÍçáÇÕÅAFSSpec Ç…ïœä∑Ç∑ÇÈ... */
if (theItem->descriptorType != typeFSS)
{
err = AECoerceDesc( theItem, typeFSS, &coerceDesc );
/* AEDesc Ç©ÇÁ FSSpec ÇéÊìæÇ∑ÇÈ */
if ( err == noErr )
{
err = AEGetDescData( &coerceDesc, fsspec, sizeof(FSSpec) );
AEDisposeDesc( &coerceDesc );
}
}
else
{
err = AEGetDescData( theItem, fsspec, sizeof(FSSpec) );
}
return( err );
}
pascal Boolean NavLaunchServicesFilterProc(AEDesc* theItem,
void* info,
NavCallBackUserData ioUserData,
NavFilterModes filterMode)
{
#pragma unused(ioUserData)
NavFileOrFolderInfo *myInfo = (NavFileOrFolderInfo *)info;
OSStatus err = noErr;
Boolean showItem = false;
FSSpec fsspec;
if ( filterMode == kNavFilteringBrowserList )
{
if (theItem->descriptorType == typeFSS)
{
/* ÉtÉ@ÉCÉãÇ‹ÇΩÇÕÉtÉHÉãÉ_ÇÃÇ«ÇøÇÁÇ©ÅH */
if (myInfo->isFolder)
{
/* Ç∑Ç◊ǃÇÃÉtÉHÉãÉ_Çï\é¶ */
showItem = true;
}
else /* ÉtÉ@ÉCÉãÇÕdžÇÈÇ™ÉtÉHÉãÉ_ÇÕǻǢ */
{
Boolean outCanOpenWithGraphicsImporter = false;
Boolean outCanOpenAsMovie = false;
err = GetFSSpecFromAEDesc( &fsspec, theItem );
if ( err != noErr ) goto BailWithError;
/*
CanQuickTimeOpenFile ä÷êîÇ…ä÷Ç∑ÇÈéQçlï∂å£ÇÅAñ{ï∂èëÇÃç≈å„Ç…é¶ÇµÇ‹Ç∑ÅB
ëŒè€ÉtÉ@ÉCÉãÇà FSSpec ÇìnÇ∑ÇæÇØÇ≈ÅAQuickTime ÇÕÅA
outCanOpenWithGraphicsImporter ÉpÉâÉÅÅ[É^ÇΔ outCanOpenAsMovie
ÉpÉâÉÅÅ[É^ÇÃíÜÇ≈ÅAÉtÉ@ÉCÉãÇ™ÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃÅA
Ç‹ÇΩÇÕǪÇÃNjNjÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈǩǫǧǩÇé¶Ç∑ílÇï‘ǵNjÇ∑ÅB
ì¡Ç…ãªñ°ê[Ç¢ÇÃÇÕÅAinFlags ÉpÉâÉÅÅ[É^ÇΔǵǃìnÇπÇÈäeéÌÇÃÉtÉâÉOÇ≈Ç∑ÅB
DZÇÍÇÁÇÕÅAQuickTime ÇÃåüçıï˚ñ@Ç…âeãøÇó^ǶNjÇ∑ÅB
éüÇ…äeéÌÉtÉâÉOÇÃÉäÉXÉgÇé¶ÇµÇ‹Ç∑ÅB
-inFlags íËêî-
kQTDontUseDataToFindImporter
DZÇÃÉtÉâÉOÇÕÅAÉtÉ@ÉCÉãíÜÇÃÉfÅ[É^ÇåüçıÇ…ÇÕóòópǵǻǢÇÊǧDž
QuickTime Ç…éwé¶ÇµÇ‹Ç∑ÅBDZÇÍÇ…ÇÊÇËÅAäJÇØÇÈÉtÉ@ÉCÉãǙǻǢÇΔǢǧ
åãâ Ç™ï‘Ç≥ÇÍÇÈèÍçáÇ…ÇÕì¡Ç…åüçıÇÃë¨ìxÇÕè„Ç™ÇËÇ‹Ç∑Ç™ÅA
QuickTime ÇÕÅAÉtÉ@ÉCÉãÉ^ÉCÉvÇ‚ÉtÉ@ÉCÉãägí£éqÇ≈îFéØÇ≈ǴǻǢ
ÉtÉ@ÉCÉãÇäJÇØÇ»Ç¢ÇΔïÒçêÇ∑ÇÈDZÇΔÇ…Ç»ÇËÇ‹Ç∑ÅB
kQTDontLookForMovieImporterIfGraphicsImporterFound
DZÇÃÉtÉâÉOÇÕÅAÉtÉ@ÉCÉãÇäJÇ≠ï˚ñ@Ç™å©Ç¬Ç©Ç¡ÇΩéûì_Ç≈ÅA
QuickTime Ç…åüçıÇèIóπÇ∑ÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅBÉtÉ@ÉCÉãÇ™ÅA
ÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃNjÇΩÇÕǪÇÃNjNjÉÄÅ[ÉrÅ[ÇΔǵǃ
äJÇØÇÈǩǫǧǩÇímÇËÇΩÇ¢èÍçáÅAǪǵǃǪÇÃï˚ñ@Çñ‚ÇÌǻǢèÍçáÇ…
DZÇÃÉtÉâÉOÇìnǵNjÇ∑ÅB
kQTAllowOpeningStillImagesAsMovies
DZÇÃÉtÉâÉOÇÕÅAQuickTime Ç…ÅAê√é~âÊÇÉÄÅ[ÉrÅ[ÇΔǵǃäJÇ≠DZÇΔÇ
åüì¢Ç∑ÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅBDZÇÃÉtÉâÉOÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç≈
äJÇØÇÈÇΔÇ´ÅAQuickTime ÇÕé©ìÆìIÇ…ÅAÉtÉ@ÉCÉãÇÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈ
ÇΔïÒçêǵNjÇ∑ÅB
kQTAllowImportersThatWouldCreateNewFile
DZÇÃÉtÉâÉOÇÕÅAQuickTime Ç…ÅAêVǵǢÉtÉ@ÉCÉãÇçÏê¨Ç∑ÇÈÉCÉìÉ|Å[É^Ç
ä‹ÇflÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅBDZÇÃÉtÉâÉOÇ™ÉNÉäÉAÇ≥ÇÍǃǢÇÈèÍçáÅA
QuickTime ÇÕÅAêVǵǢÉtÉ@ÉCÉãÇçÏê¨ÇµÇ»Ç≠ǃLJǪÇÃNjNj
ÉCÉìÉ|Å[ÉgÇ≈Ç´ÇÈÉCÉìÉ|Å[É^ÇÃÇ›Çä‹ÇflÇ‹Ç∑ÅB
kQTAllowAggressiveImporters
DZÇÃÉtÉâÉOÇÕÅAPICT Ç‚ TEXT ÇÃÇÊǧǻí ó·ÉÄÅ[ÉrÅ[ÇΔÇÕçlǶÇÁÇÍǻǢ
ÉtÉ@ÉCÉãÉ^ÉCÉvÇÃÇΩÇflÇ…ÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^Çä‹ÇflÇÈÇÊǧDžéwé¶ÇµÇ‹Ç∑ÅB
DZÇÃÉtÉâÉOÇ™ÉNÉäÉAÇ≥ÇÍǃǢÇÈèÍçáÅAQuickTime ÇÕÅADZÇÍÇÁÇÃ
ÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^ÇèúäOǵNjÇ∑ÅB
åüçıÇÃë¨ìxÇ™å¸è„Ç∑ÇÈÇÃÇ≈ÅAÉtÉ@ÉCÉãÇäJÇ≠ï˚ñ@Ç…Ç±ÇæÇÌÇÁǻǢèÍçáÇÕÅA
kQTDontLookForMovieImporterIfGraphicsImporterFound
ÉtÉâÉOÇÃégópÇêÑèßǵNjÇ∑ÅBèÛãµÇ…ÇÊǡǃÇÕÅAåüçıÇÃë¨ìxÇå¸è„Ç≥ÇπÇÈ
kQTDontUseDataToFindImporter ÉtÉâÉOÇégǧÇÃÇ™ï÷óòǩLJǵÇÍÇ‹ÇπÇÒÇ™ÅA
åáì_ÇÕÅAägí£éqÇ‹ÇΩÇÕÉtÉ@ÉCÉãÉ^ÉCÉvÇîFéØÇ≈ǴǻǢÉtÉ@ÉCÉãÇÉXÉLÉbÉv
ǵǃǵNjǧDZÇΔÇ≈Ç∑ÅB
*/
err = CanQuickTimeOpenFile(
&fsspec,
/* ÉtÉ@ÉCÉãÇÃéÌófiÅBï™Ç©ÇÁǻǢèÍçáÇÕ 0 */
myInfo->fileAndFolder.fileInfo.finderInfo.fdType,
/* ÉtÉ@ÉCÉãÇÃägí£éqÅBï™Ç©ÇÁǻǢèÍçáÇÕ 0 */
0,
/* ÉtÉ@ÉCÉãÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç≈äJÇØÇÈèÍçáÇÕ true Çï‘Ç∑
*/
#if SHOW_ONLY_VIDEO_FILES
&outCanOpenWithGraphicsImporter,
#elif SHOW_ONLY_AUDIO_FILES
0,
#endif
/* ÉtÉ@ÉCÉãÇÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^Ç≈äJÇØÇÈèÍçáÇÕ true Çï‘Ç∑
*/
&outCanOpenAsMovie,
/* ÉtÉ@ÉCÉãÇÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^Ç‹ÇΩÇÕÉÄÅ[ÉrÅ[ÉCÉìÉ|Å[É^ÇÃ
Ç«ÇøÇÁÇ≈LJäJÇØÇÈèÍçáÇÕÅAtrue Çï‘Ç∑Ç™
QuickTime ÇÕÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇÃégópÇóDêÊÇ∑ÇÈ
*/
nil,
/* inFlags
Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@QuickTime Ç…ÅAÉtÉ@ÉCÉãÇå©Ç¬ÇØéüëÊåüçıÇèIóπÇ∑ÇÈÇÊǧDžéwé¶Ç∑ÇÈÇΩÇflÇ…
Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@Å@kQTDontLookForMovieImporterIfGraphicsImporterFound ÇéwíËÇ∑ÇÈ
ÉtÉ@ÉCÉãÇÅAÉOÉâÉtÉBÉbÉNÉXÉCÉìÉ|Å[É^ÇégǡǃäJÇØÇÈÇ©ÅA
ÉÄÅ[ÉrÅ[ÇΔǵǃäJÇØÇÈÇ©ÇÕñ‚ÇÌǻǢ */
kQTDontLookForMovieImporterIfGraphicsImporterFound);
if ( err != noErr ) goto BailWithError;
if (outCanOpenAsMovie)
{
OSErr err = noErr;
// ÉtÉ@ÉCÉãÉ^ÉCÉvÇ…ä÷òAïtÇØÇÁÇÍǃǢÇÈ MovieImport
// ÉRÉìÉ|Å[ÉlÉìÉg
Component theImporter = nil;
// componentManufacturer Çå©ÇÈÇΩÇflÇ…égóp
ComponentDescription cd;
OSType destinationMediaType = 0;
long myFlags = 0;
AliasHandle theAliasHandle;
// ÉGÉCÉäÉAÉXÉfÅ[É^éQèΔÇçÏê¨
err = NewAlias(nil, &fsspec, &theAliasHandle);
if (err == noErr)
{
// ÉCÉìÉ|Å[É^ÉRÉìÉ|Å[ÉlÉìÉgÇíTÇ∑
// ÅiComponentInstance Ç≈ÇÕǻǢÇÃÇ≈ÅA
// džÇΔÇ≈ï¬Ç∂ÇÈïKóvÇÕǻǢÅj
err = GetMovieImporterForDataRef(kAliasDataRefType,
(Handle)theAliasHandle,
myFlags,
&theImporter);
if (noErr == err)
{
// ê‡ñæÇÃÉtÉâÉOÇΔêªë¢å≥É^ÉCÉv
// ÇÃÉtÉBÅ[ÉãÉhÇå©ÇÈ
GetComponentInfo(theImporter,
&cd, nil, nil, nil);
// DZÇÃÉRÉìÉ|Å[ÉlÉìÉgÇ…ÇÊǡǃ
// movieImportMustGetDestinationMediaType Ç™ê›íËÇ≥ÇÍǃ
// Ç¢ÇÈèÍçáÇÕÅAMovieImportGetDestinationMediaType
// ÇDZÇÃÉRÉìÉ|Å[ÉlÉìÉgÇ…åƒÇ—èoÇ∑DZÇΔÇ…ÇÊÇËÅAëóÇË
// êÊÇÃÉÅÉfÉBÉAÉ^ÉCÉvÇèΔâÔÇ≈Ç´ÇÈDZÇΔÇé¶Ç∑
if (cd.componentFlags &
movieImportMustGetDestinationMediaType)
{
// ÉCÉìÉ|Å[É^Ç…ÉCÉìÉ|Å[ÉgêÊÇÃÉÅÉfÉBÉAÉ^ÉCÉvÇêqÇÀÇÈ
// ÅiíçÅFÉCÉìÉ|Å[É^ÉRÉìÉ|Å[ÉlÉìÉgÇäJÇ≠
// ïKóvÇÕǻǢÅBïKóvÇ»èàóùÇ™é©ìÆìIÇ…çsÇÌÇÍÇÈÅj
MovieImportGetDestinationMediaType(
(MovieImportComponent)theImporter,
&destinationMediaType);
}
else // GetComponentInfo Ç©ÇÁÇÃêªë¢å≥É^ÉCÉv
// ÇégópÇ∑ÇÈÅBêªë¢å≥ÉtÉBÅ[ÉãÉhÇÕÅA
// ÉRÉìÉ|Å[ÉlÉìÉgÇ…ÇÊǡǃÉTÉ|Å[ÉgÇ≥ÇÍÇÈ
// QuickTime ÉÅÉfÉBÉAÉ^ÉCÉvÇé¶ÇµÇƒÇ¢ÇÈ
// ÅiÇΩÇΔǶnjÅAÉTÉEÉìÉhÇÕ 'soun'ÅjÅB
// ÉTÉuÉ^ÉCÉvÇÃílÇÕÅAÉRÉìÉ|Å[ÉlÉìÉgÇ™
// ÉCÉìÉ|Å[ÉgÇ≈Ç´ÇÈÉfÅ[É^É^ÉCÉvÇ
// é¶Ç∑ÅiÇΩÇΔǶnj 'AIFF'Åj
{
destinationMediaType =
cd.componentManufacturer;
}
}
// else
// DZÇÃå`éÆópÇÃÉCÉìÉ|Å[É^ÇÕë∂ç›ÇµÇ»Ç¢Ç™ QuickTime Ç™
// DZÇÃå`éÆÅiQuickTime ÉÄÅ[ÉrÅ[ÉtÉ@ÉCÉãÅj
// ÇäJÇ≠DZÇΔÇ™Ç≈Ç´ÇÈÇ©ÅAÇ‹ÇΩÇÕÉCÉìÉ|Å[É^Ç™
// ë∂ç›ÇµÇ»Ç¢Ç©ÇÃÇ¢Ç∏ÇÍÇ©ÅBÇ«ÇøÇÁÇÃèÍçáLJÅA
// destinationMediaType ÇÕ 0
// åªéûì_Ç≈ÇÕÅAéøñ‚ÇÃìöǶDžÇÕ destinationMediaType
// ÅiǮǪÇÁÇ≠ 0ÅjÇégǧ
//
// ÉÅÉfÉBÉAÉ^ÉCÉvÇ™ï™Ç©Ç¡ÇƒÇ®ÇËÅAÉTÉ|Å[Égǵǃ
// Ç¢ÇÈÉgÉâÉbÉNÉ^ÉCÉvÇämîFÇ≈Ç´ÇÈÅB
// ǪÇÍÇîFéØÇ≈ǴǻǩǡÇΩèÍçáÇÕÅAÉtÉ@ÉCÉãÇäJÇ´ÅA
// GetMovieIndTrackType Çégǡǃ
// í≤Ç◊ÇÈïKóvǙdžÇÈ
if (destinationMediaType)
{
#if SHOW_ONLY_AUDIO_FILES
// ÉTÉEÉìÉh ('soun') ÉÅÉfÉBÉAÉ^ÉCÉvǩǫǧǩÇÉ`ÉFÉbÉN
if (destinationMediaType == SoundMediaType)
#elif SHOW_ONLY_VIDEO_FILES
// ÉrÉfÉI ('vide') ÉÅÉfÉBÉAÉ^ÉCÉvǩǫǧǩÇÉ`ÉFÉbÉN
if (destinationMediaType == VideoMediaType)
#endif
{
showItem = true;
}
}
else // óLóÕÇ»èÓïÒǙǻǢÇΩÇflÅAäJǢǃ
// GetMovieIndTrackType Çégǡǃ
// ÉÄÅ[ÉrÅ[ÇÃÉgÉâÉbÉNÇí≤Ç◊ÇÈÅB
// ǪÇÃå„ÅAïKÇ∏ÉÄÅ[ÉrÅ[Çï¬Ç∂ÇÈ
{
OSErr err = noErr;
short fileRefNum = 0;
err = OpenMovieFile(&fsspec,
&fileRefNum,
fsRdPerm);
if (err == noErr)
{
// ç≈èâÇÃÉÄÅ[ÉrÅ[ÇéÊìæÇµÇΩÇ¢
short resID = 0;
Movie theMovie = nil;
err = NewMovieFromFile(&theMovie,
fileRefNum,
&resID,
NULL,
newMovieActive,
NULL);
if (err == noErr)
{
// ÉgÉâÉbÉNÅiÉÅÉfÉBÉAÅjÉ^ÉCÉvÇí≤Ç◊ÇÈ
if(GetMovieIndTrackType(theMovie,
1L,
#if SHOW_ONLY_AUDIO_FILES
SoundMediaType,
#elif SHOW_ONLY_VIDEO_FILES
VideoMediaType,
#endif
movieTrackMediaType))
{
// ÉÄÅ[ÉrÅ[ÇÕäÛñ]ÇÃÉÅÉfÉBÉAÉ^ÉCÉvÅI
showItem = true;
}
DisposeMovie(theMovie);
}
CloseMovieFile(fileRefNum);
}
}
DisposeHandle((Handle)theAliasHandle);
}
}
else if (outCanOpenWithGraphicsImporter)
{
showItem = true;
}
}
}
}
return (showItem);
BailWithError:
return( false );
}
|